# -*- coding: utf-8 -*-
"""
Module Description: 跨服业务中间状态方法

说明：
1. 区服发起请求，变更中间状态，不做数据库错误捕获 - 不影响业务数据，但影响业务体验，特别是跨服遗迹打开宝箱这种操作

2. 跨服开始处理请求， 更变中间状态， 不做数据库错误捕获 - 不影响业务数据，但影响业务体验，特别是跨服遗迹打开宝箱这种操作

3. 跨服处理完请求，更变中间状态写res， 做数据库错误捕获，尝试重试，重试失败写log日志

4. 区服接收结果，有返回结果 变更中间状态， 无结果不变更 尝试中间状态获取结果
    有返回结果：
        变更中间状态为正常返回，做数据库错误捕获，区服继续执行后续逻辑
    无返回结果：
        链接丢失，不更改中间状态为正常返回，尝试从中间状态数据库获取结果并修改状态为尝试获取结果，该操作加事务，并做错误捕获，失败写log，记录尝试中间状态失败

中间状态分析：
    区服状态为 ：
        1. Complete 请求一定正常完成， 业务逻辑完整执行
        2. Start 根据log 可判断是正常完成 还是 尝试中间状态失败
        3. TryDtsRes 尝试中间状态成功， 业务逻辑完整执行

Date: 2018/12/12
Author: FQ
"""
from pyshare.dal.repository_impl.character_center import DistributedTransactionStatRepository
from pyshare.core.context import get_trace_id
from pyshare.utils.service_switch import is_open_dts
from common.service_config import get_server_id, get_action_id


class RecordAreaStat(object):
    """记录区服发起请求记录"""
    def __init__(self, rid):
        self.rid = rid
        self.res = None

    def set_res(self, res):
        self.res = res

    def __enter__(self):
        if is_open_dts():
            DistributedTransactionStatRepository.create(get_trace_id(), self.rid, get_server_id(), get_action_id())
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.res and is_open_dts():
            # 跨服正常返回结果时，记录状态为区服接收结果，否则不变更状态
            DistributedTransactionStatRepository.update_stat_complete(get_trace_id())
        return True